<!DOCTYPE html>
<!-- saved from url=(0050)http://www.cnblogs.com/sunshinewave/p/5296666.html -->
<html lang="zh-cn"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<meta name="viewport" content="width=device-width, initial-scale=1">
<title>shared_ptr 的使用及注意事项 - sunshinewave - 博客园</title>
<link type="text/css" rel="stylesheet" href="./shared_ptr 的使用及注意事项 - sunshinewave - 博客园_files/blog-common.css">
<link id="MainCss" type="text/css" rel="stylesheet" href="./shared_ptr 的使用及注意事项 - sunshinewave - 博客园_files/bundle-KJC.css">
<link id="mobile-style" media="only screen and (max-width: 768px)" type="text/css" rel="stylesheet" href="./shared_ptr 的使用及注意事项 - sunshinewave - 博客园_files/bundle-KJC-mobile.css">
<link title="RSS" type="application/rss+xml" rel="alternate" href="http://www.cnblogs.com/sunshinewave/rss">
<link title="RSD" type="application/rsd+xml" rel="EditURI" href="http://www.cnblogs.com/sunshinewave/rsd.xml">
<link type="application/wlwmanifest+xml" rel="wlwmanifest" href="http://www.cnblogs.com/sunshinewave/wlwmanifest.xml">
<script async="" src="./shared_ptr 的使用及注意事项 - sunshinewave - 博客园_files/analytics.js"></script><script src="./shared_ptr 的使用及注意事项 - sunshinewave - 博客园_files/jquery.js" type="text/javascript"></script>  
<script type="text/javascript">var currentBlogApp = 'sunshinewave', cb_enable_mathjax=false;var isLogined=false;</script>
<script src="./shared_ptr 的使用及注意事项 - sunshinewave - 博客园_files/blog-common.js" type="text/javascript"></script>
</head>
<body>
<a name="top"></a>

<table class="Framework" cellspacing="0" cellpadding="0" width="100%">
	<tbody><tr>
		<td colspan="3">
			
<div id="top">
<table cellpadding="10" cellspacing="0">
	<tbody><tr>
		<td nowrap="">
			<h1><a id="Header1_HeaderTitle" class="headermaintitle" href="http://www.cnblogs.com/sunshinewave/">sunshinewave</a></h1>
			
		</td>
	</tr>
</tbody></table>
</div>
<div id="sub">
	<div id="sub-right"><div id="blog_stats">
<div class="BlogStats">posts - 14, comments - 5, trackbacks - 0, articles - 0</div></div></div>
	
&nbsp;
<a id="blog_nav_sitehome" href="http://www.cnblogs.com/">博客园</a>&nbsp;:: 
<a id="blog_nav_myhome" href="http://www.cnblogs.com/sunshinewave/">首页</a>&nbsp;::
<a id="blog_nav_newpost" rel="nofollow" href="https://i.cnblogs.com/EditPosts.aspx?opt=1">新随笔</a>&nbsp;::
<a id="blog_nav_contact" accesskey="9" rel="nofollow" href="https://msg.cnblogs.com/send/sunshinewave">联系</a>&nbsp;::
<a id="blog_nav_rss" href="http://www.cnblogs.com/sunshinewave/rss">订阅</a>
<a id="blog_nav_rss_image" class="XMLLink" href="http://www.cnblogs.com/sunshinewave/rss"><img src="./shared_ptr 的使用及注意事项 - sunshinewave - 博客园_files/xml.gif" alt="订阅"></a>&nbsp;::
<a id="blog_nav_admin" rel="nofollow" href="https://i.cnblogs.com/">管理</a>

</div>
		</td>
	</tr>
	<tr>
		<td class="LeftCell">
			<div id="leftmenu">
            	
		            <div id="blog-calendar" style=""><table id="blogCalendar" class="Cal" cellspacing="0" cellpadding="0" title="Calendar">
	<tbody><tr><td colspan="7"><table class="CalTitle" cellspacing="0">
		<tbody><tr><td class="CalNextPrev"><a href="javascript:void(0);" onclick="loadBlogCalendar(&#39;2017/09/01&#39;);return false;">&lt;</a></td><td align="center">2017年10月</td><td class="CalNextPrev" align="right"><a href="javascript:void(0);" onclick="loadBlogCalendar(&#39;2017/11/01&#39;);return false;">&gt;</a></td></tr>
	</tbody></table></td></tr><tr><th class="CalDayHeader" align="center" abbr="日" scope="col">日</th><th class="CalDayHeader" align="center" abbr="一" scope="col">一</th><th class="CalDayHeader" align="center" abbr="二" scope="col">二</th><th class="CalDayHeader" align="center" abbr="三" scope="col">三</th><th class="CalDayHeader" align="center" abbr="四" scope="col">四</th><th class="CalDayHeader" align="center" abbr="五" scope="col">五</th><th class="CalDayHeader" align="center" abbr="六" scope="col">六</th></tr><tr><td class="CalOtherMonthDay" align="center">24</td><td class="CalOtherMonthDay" align="center">25</td><td class="CalOtherMonthDay" align="center">26</td><td class="CalOtherMonthDay" align="center">27</td><td class="CalOtherMonthDay" align="center">28</td><td class="CalOtherMonthDay" align="center">29</td><td class="CalOtherMonthDay" align="center">30</td></tr><tr><td class="CalWeekendDay" align="center">1</td><td align="center">2</td><td align="center">3</td><td align="center">4</td><td align="center">5</td><td align="center">6</td><td class="CalWeekendDay" align="center">7</td></tr><tr><td class="CalWeekendDay" align="center">8</td><td align="center">9</td><td align="center">10</td><td align="center">11</td><td align="center">12</td><td align="center">13</td><td class="CalWeekendDay" align="center">14</td></tr><tr><td class="CalWeekendDay" align="center">15</td><td align="center">16</td><td align="center">17</td><td class="CalTodayDay" align="center">18</td><td align="center">19</td><td align="center">20</td><td class="CalWeekendDay" align="center">21</td></tr><tr><td class="CalWeekendDay" align="center">22</td><td align="center">23</td><td align="center">24</td><td align="center">25</td><td align="center">26</td><td align="center">27</td><td class="CalWeekendDay" align="center">28</td></tr><tr><td class="CalWeekendDay" align="center">29</td><td align="center">30</td><td align="center">31</td><td class="CalOtherMonthDay" align="center">1</td><td class="CalOtherMonthDay" align="center">2</td><td class="CalOtherMonthDay" align="center">3</td><td class="CalOtherMonthDay" align="center">4</td></tr>
</tbody></table></div><script type="text/javascript">loadBlogDefaultCalendar();</script>
		            
<div id="cell">
<img src="./shared_ptr 的使用及注意事项 - sunshinewave - 博客园_files/icon-group.jpg" hspace="5" align="left" vspace="2"><h3>公告</h3>
<div id="news">
	<div id="blog-news"><div id="profile_block">昵称：<a href="http://home.cnblogs.com/u/sunshinewave/">sunshinewave</a><br>园龄：<a href="http://home.cnblogs.com/u/sunshinewave/" title="入园时间：2012-06-26">5年3个月</a><br>粉丝：<a href="http://home.cnblogs.com/u/sunshinewave/followers/">5</a><br>关注：<a href="http://home.cnblogs.com/u/sunshinewave/followees/">12</a><div id="p_b_follow"><a href="javascript:void(0);" onclick="follow(&#39;3a580169-44bf-e111-aa3f-842b2b196315&#39;)">+加关注</a></div></div></div><script type="text/javascript">loadBlogNews();</script>
</div>
</div>

	            
	            <div id="blog-sidecolumn"><div id="sidebar_search" class="sidebar-block">
<div id="cell">
<img src="./shared_ptr 的使用及注意事项 - sunshinewave - 博客园_files/icon-group.jpg" hspace="5" align="left" vspace="2">
<h3 class="catListTitle">搜索</h3>
<div id="widget_my_zzk" class="div_my_zzk"><input type="text" id="q" onkeydown="return zzk_go_enter(event);" class="input_my_zzk">&nbsp;<input onclick="zzk_go()" type="button" value="找找看" id="btnZzk" class="btn_my_zzk"></div>
<div id="widget_my_google" class="div_my_zzk"><input type="text" name="google_q" id="google_q" onkeydown="return google_go_enter(event)" class="input_my_zzk">&nbsp;<input onclick="google_go()" type="button" value="谷歌搜索" class="btn_my_zzk"></div>
</div></div><div id="sidebar_shortcut" class="sidebar-block">
<div id="cell">
<img src="./shared_ptr 的使用及注意事项 - sunshinewave - 博客园_files/icon-group.jpg" hspace="5" align="left" vspace="2">
<h3>常用链接</h3>
<ul>
<li><a href="http://www.cnblogs.com/sunshinewave/p/" title="我的博客的随笔列表">我的随笔</a></li><li><a href="http://www.cnblogs.com/sunshinewave/MyComments.html" title="我发表过的评论列表">我的评论</a></li><li><a href="http://www.cnblogs.com/sunshinewave/OtherPosts.html" title="我评论过的随笔列表">我的参与</a></li><li><a href="http://www.cnblogs.com/sunshinewave/RecentComments.html" title="我的博客的评论列表">最新评论</a></li><li><a href="http://www.cnblogs.com/sunshinewave/tag/" title="我的博客的标签列表">我的标签</a></li>
<li><a id="itemListLink" onclick="this.blur();WarpClass(&#39;itemListLink&#39;, &#39;itemListLin_con&#39;);return false;" href="http://www.cnblogs.com/sunshinewave/p/5296666.html#">更多链接</a></li>
</ul>
<div id="itemListLin_con" style="display:none;">

</div>
</div></div><div id="sidebar_toptags" class="sidebar-block"></div><div id="sidebar_categories">
		<div id="cell">
		<img src="./shared_ptr 的使用及注意事项 - sunshinewave - 博客园_files/icon-group.jpg" hspace="5" align="left" vspace="2"><h3>随笔档案</h3>
		
				<ul>
			
				<li><a id="CatList_LinkList_0_Link_0" href="http://www.cnblogs.com/sunshinewave/archive/2016/03.html">2016年3月 (3)</a>
				</li>
			
				<li><a id="CatList_LinkList_0_Link_1" href="http://www.cnblogs.com/sunshinewave/archive/2013/08.html">2013年8月 (1)</a>
				</li>
			
				<li><a id="CatList_LinkList_0_Link_2" href="http://www.cnblogs.com/sunshinewave/archive/2013/03.html">2013年3月 (1)</a>
				</li>
			
				<li><a id="CatList_LinkList_0_Link_3" href="http://www.cnblogs.com/sunshinewave/archive/2012/10.html">2012年10月 (3)</a>
				</li>
			
				<li><a id="CatList_LinkList_0_Link_4" href="http://www.cnblogs.com/sunshinewave/archive/2012/09.html">2012年9月 (5)</a>
				</li>
			
				<li><a id="CatList_LinkList_0_Link_5" href="http://www.cnblogs.com/sunshinewave/archive/2012/06.html">2012年6月 (1)</a>
				</li>
			
				</ul>
			</div>
	</div><div id="recent_comments_wrap">
    <div id="cell">
        <img src="./shared_ptr 的使用及注意事项 - sunshinewave - 博客园_files/icon-group.jpg" hspace="5" align="left" vspace="2">
        <h3>最新评论</h3>
        <div class="RecentComment">
            <div id="RecentCommentsBlock"><ul>
        <li class="recent_comment_title"><a href="http://www.cnblogs.com/sunshinewave/p/3265869.html#2804974">1. Re:小感</a></li>
        <li class="recent_comment_body">同感 加油哈<br>不过我是工作之后才入门3d编程，呵呵。<br>现在也还没入门。</li>
        <li class="recent_comment_author">--codewj</li>
        <li class="recent_comment_title"><a href="http://www.cnblogs.com/sunshinewave/archive/2012/09/21/2696215.html#2478094">2. Re:游戏程序设计之渲染管道</a></li>
        <li class="recent_comment_body">看着像是龙书的内容。。。。</li>
        <li class="recent_comment_author">--Allen Wu</li>
        <li class="recent_comment_title"><a href="http://www.cnblogs.com/sunshinewave/archive/2012/09/21/2696215.html#2477981">3. Re:游戏程序设计之渲染管道</a></li>
        <li class="recent_comment_body">很不错 学习了</li>
        <li class="recent_comment_author">--john23.net</li>
        <li class="recent_comment_title"><a href="http://www.cnblogs.com/sunshinewave/archive/2012/06/28/2567175.html#2426387">4. Re:暑假计划</a></li>
        <li class="recent_comment_body">@zdd谢谢...</li>
        <li class="recent_comment_author">--sunshinewave</li>
        <li class="recent_comment_title"><a href="http://www.cnblogs.com/sunshinewave/archive/2012/06/28/2567175.html#2423882">5. Re:暑假计划</a></li>
        <li class="recent_comment_body">选定一个方向，坚持住！</li>
        <li class="recent_comment_author">--zdd</li>
</ul>
</div>
        </div>
    </div>
</div>
<div id="topview_posts_wrap">
    <div id="cell">
        <img src="./shared_ptr 的使用及注意事项 - sunshinewave - 博客园_files/icon-group.jpg" hspace="5" align="left" vspace="2">
        <h3>阅读排行榜</h3>
        <div class="RecentComment">
            <div id="TopViewPostsBlock"><ul><li><a href="http://www.cnblogs.com/sunshinewave/p/5296666.html">1. shared_ptr 的使用及注意事项(5818)</a></li><li><a href="http://www.cnblogs.com/sunshinewave/archive/2012/09/21/2696215.html">2. 游戏程序设计之渲染管道(3029)</a></li><li><a href="http://www.cnblogs.com/sunshinewave/archive/2012/09/13/2682662.html">3. 面试题2(1460)</a></li><li><a href="http://www.cnblogs.com/sunshinewave/archive/2012/09/17/2689850.html">4. 游戏程序设计DirectX 9(1269)</a></li><li><a href="http://www.cnblogs.com/sunshinewave/archive/2012/10/07/2713466.html">5. 程序员笔试知识点整理(895)</a></li></ul></div>
        </div>
    </div>
</div><div id="topfeedback_posts_wrap">
    <div id="cell">
        <img src="./shared_ptr 的使用及注意事项 - sunshinewave - 博客园_files/icon-group.jpg" hspace="5" align="left" vspace="2">
        <h3>评论排行榜</h3>
        <div class="RecentComment">
            <div id="TopFeedbackPostsBlock"><ul><li><a href="http://www.cnblogs.com/sunshinewave/archive/2012/06/28/2567175.html">1. 暑假计划(2)</a></li><li><a href="http://www.cnblogs.com/sunshinewave/archive/2012/09/21/2696215.html">2. 游戏程序设计之渲染管道(2)</a></li><li><a href="http://www.cnblogs.com/sunshinewave/p/3265869.html">3. 小感(1)</a></li></ul></div>
        </div>
    </div>    
</div>
<div id="sidebar_topdiggedposts" class="sidebar-block"><div id="topdigg_posts_wrap">
<div id="cell">
<img src="./shared_ptr 的使用及注意事项 - sunshinewave - 博客园_files/icon-group.jpg" hspace="5" align="left" vspace="2"><h3>推荐排行榜</h3>
<div class="RecentComment">
	<div id="TopDiggPostsBlock"><ul><li><a href="http://www.cnblogs.com/sunshinewave/archive/2012/09/21/2696215.html">1. 游戏程序设计之渲染管道(1)</a></li></ul></div>
</div>
</div></div></div></div><script type="text/javascript">loadBlogSideColumn();</script>
			</div>
		</td>
		<td class="MainCell">
			<div id="main">
				
<div id="post_detail">
	<div class="post">
		<div class="posthead">
			<h2>
				<a id="cb_post_title_url" class="singleposttitle" href="http://www.cnblogs.com/sunshinewave/p/5296666.html">shared_ptr 的使用及注意事项</a>
			</h2>
 			Posted on <span id="post-date">2016-03-19 22:56</span> <a href="http://www.cnblogs.com/sunshinewave/">sunshinewave</a> 阅读(<span id="post_view_count">5820</span>) 评论(<span id="post_comment_count">0</span>)  <a href="https://i.cnblogs.com/EditPosts.aspx?postid=5296666" rel="nofollow">编辑</a> <a href="http://www.cnblogs.com/sunshinewave/p/5296666.html#" onclick="AddToWz(5296666);return false;">收藏</a>
			<script type="text/javascript">var allowComments=true,cb_blogId=121140,cb_entryId=5296666,cb_blogApp=currentBlogApp,cb_blogUserGuid='3a580169-44bf-e111-aa3f-842b2b196315',cb_entryCreatedDate='2016/3/19 22:56:00';loadViewCount(cb_entryId);</script>
			
		</div>
		<div class="postbody"><div id="cnblogs_post_body"><p>1. 声明<br>#include &lt;boost/shared_ptr.hpp&gt;</p>
<p>class UsersBitmap {</p>
<p>...</p>
<p>}</p>
<p>typedef boost::shared_ptr&lt;UsersBitmap&gt; UsersBitmapPtr;</p>
<p>2. 使用</p>
<p>UsersBitmapPtr login_users_;<br>UsersBitmapPtr temp_login_users(new UsersBitmap());&nbsp;&nbsp;&nbsp; //指向对象</p>
<p>login_users_.reset(new UsersBitmap());&nbsp;&nbsp;&nbsp;&nbsp; //指针指向新的地方</p>
<p>login_users_.reset();&nbsp; //指针置空</p>
<p>&nbsp;</p>
<p>///////////////////////////////////////////////////////////////////////////</p>
<p>////////////////////////////////////</p>
<p>虽然boost.shared_ptr是个非常好的东西，使用它可以使得c++程序不需要考虑内存释放的问题，但是还是有很多必须注意的地方。下面罗列了一些本人在实际工作中经常碰到的使用shared_ptr出问题的几种情况。&nbsp;<br><br>1． shared_ptr多次引用同一数据，如下：<br>{<br>int* pInt = new int[100];<br>boost::shared_ptr&lt;int&gt; sp1(pInt);<br>// 一些其它代码之后…<br>boost::shared_ptr&lt;int&gt; sp2(pInt);<br>}<br><br>这种情况在实际中是很容易发生的，结果也是非常致命的，它会导致两次释放同一块内存，而破坏堆。&nbsp;<br><br>2．使用shared_ptr包装this指针带来的问题，如下：<br><br>class tester&nbsp;<br>{<br>public:<br>&nbsp; tester()<br>&nbsp; ~tester()<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; std::cout &lt;&lt; "析构函数被调用!\n";&nbsp;<br>&nbsp; }<br>public:<br>&nbsp; boost::shared_ptr&lt;tester&gt; sget()<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; return boost::shared_ptr&lt;tester&gt;(this);<br>&nbsp; }<br>};<br><br>int main()<br>{<br>&nbsp; tester t;<br>&nbsp; boost::shared_ptr&lt;tester&gt; sp =&nbsp; t.sget(); // …<br>&nbsp; return 0;<br>}<br><br>也将导致两次释放t对象破坏堆栈，一次是出栈时析构，一次就是shared_ptr析构。若有这种需要，可以使用下面代码。<br><br>class tester : public boost::enable_shared_from_this&lt;tester&gt;<br>{<br>public:<br>&nbsp; tester()<br>&nbsp; ~tester()<br>&nbsp; {<br>&nbsp; std::cout &lt;&lt; "析构函数被调用!\n";&nbsp;<br>&nbsp; }<br>public:<br>&nbsp; boost::shared_ptr&lt;tester&gt; sget()<br>&nbsp; {<br>&nbsp; return shared_from_this();<br>&nbsp; }<br>};<br><br>int main()<br>{<br>&nbsp; boost::shared_ptr&lt;tester&gt; sp(new tester);<br>&nbsp; // 正确使用sp 指针。<br>&nbsp; sp-&gt;sget();<br>&nbsp; return 0;<br>}<br><br>3． shared_ptr循环引用导致内存泄露，代码如下：<br><br>class parent;<br>class child;&nbsp;<br><br>typedef boost::shared_ptr&lt;parent&gt; parent_ptr;<br>typedef boost::shared_ptr&lt;child&gt; child_ptr;&nbsp;<br><br>class parent<br>{<br>public:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ~parent() {&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; std::cout &lt;&lt;"父类析构函数被调用.\n";&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>public:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; child_ptr children;<br>};<br><br>class child<br>{<br>public:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ~child() {&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; std::cout &lt;&lt;"子类析构函数被调用.\n";&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>public:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; parent_ptr parent;<br>};<br><br>int main()<br>{<br>&nbsp; parent_ptr father(new parent());<br>&nbsp; child_ptr son(new child);<br>&nbsp; // 父子互相引用。<br>&nbsp; father-&gt;children = son;<br>&nbsp; son-&gt;parent = father;<br>&nbsp; return 0;<br>}<br><br>如上代码，将在程序退出前，father的引用计数为2，son的计数也为2，退出时，shared_ptr所作操作就是简单的将计数减1，如果为0则释放，显然，这个情况下，引用计数不为0，于是造成father和son所指向的内存得不到释放，导致内存泄露。&nbsp;<br><br>4． 在多线程程序中使用shared_ptr应注意的问题。代码如下：<br><br>class tester&nbsp;<br>{<br>public:<br>&nbsp; tester() {}<br>&nbsp; ~tester() {}<br>&nbsp; // 更多的函数定义…<br>};<br><br>void fun(boost::shared_ptr&lt;tester&gt; sp)<br>{<br>&nbsp; // !!!在这大量使用sp指针.<br>&nbsp; boost::shared_ptr&lt;tester&gt; tmp = sp;<br>}<br><br>int main()<br>{<br>&nbsp; boost::shared_ptr&lt;tester&gt; sp1(new tester);<br>&nbsp; // 开启两个线程，并将智能指针传入使用。<br>&nbsp; boost::thread t1(boost::bind(&amp;fun, sp1));<br>&nbsp; boost::thread t2(boost::bind(&amp;fun, sp1));<br>&nbsp; t1.join();<br>&nbsp; t2.join();<br>&nbsp; return 0;<br>}<br><br>这个代码带来的问题很显然，由于多线程同是访问智能指针，并将其赋值到其它同类智能指针时，很可能发生两个线程同时在操作引用计数（但并不一定绝对发生），而导致计数失败或无效等情况，从而导致程序崩溃，如若不知根源，就无法查找这个bug，那就只能向上帝祈祷程序能正常运行。<br><br>可能一般情况下并不会写出上面这样的代码，但是下面这种代码与上面的代码同样，如下：<br><br>class tester&nbsp;<br>{<br>public:<br>&nbsp; tester() {}<br>&nbsp; ~tester() {}<br>public:<br>&nbsp; boost::shared_ptr&lt;int&gt; m_spData; // 可能其它类型。<br>};<br><br>tester gObject;<br><br>void fun(void)<br>{<br>&nbsp; // !!!在这大量使用sp指针.<br>&nbsp; boost::shared_ptr&lt;int&gt; tmp = gObject.m_spData;<br>}<br><br>int main()<br>{<br>&nbsp; // 多线程。<br>&nbsp; boost::thread t1(&amp;fun);<br>&nbsp; boost::thread t2(&amp;fun);<br>&nbsp; t1.join();<br>&nbsp; t2.join();<br>&nbsp; return 0;<br>}<br><br>情况是一样的。要解决这类问题的办法也很简单，使用boost.weak_ptr就可以很方便解决这个问题。第一种情况修改代码如下：<br><br>class tester&nbsp;<br>{<br>public:<br>&nbsp; tester() {}<br>&nbsp; ~tester() {}<br>&nbsp; // 更多的函数定义…<br>};<br><br>void fun(boost::weak_ptr&lt;tester&gt; wp)<br>{<br>&nbsp; boost::shared_ptr&lt;tester&gt; sp = wp.lock;<br>&nbsp; if (sp)<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; // 在这里可以安全的使用sp指针.<br>&nbsp; }<br>&nbsp; else<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; std::cout &lt;&lt; “指针已被释放!” &lt;&lt; std::endl;<br>&nbsp; }<br>}&nbsp;<br><br>int main()<br>{<br>&nbsp; boost::shared_ptr&lt;tester&gt; sp1(new tester);<br>&nbsp; boost.weak_ptr&lt;tester&gt; wp(sp1);<br>&nbsp; // 开启两个线程，并将智能指针传入使用。<br>&nbsp; boost::thread t1(boost::bind(&amp;fun, wp));<br>&nbsp; boost::thread t2(boost::bind(&amp;fun, wp));<br>&nbsp; t1.join();<br>&nbsp; t2.join();<br>&nbsp; return 0;<br>}<br><br>boost.weak_ptr指针功能一点都不weak，weak_ptr是一种可构造、可赋值以不增加引用计数来管理shared_ptr的指针，它可以方便的转回到shared_ptr指针，使用weak_ptr.lock函数就可以得到一个shared_ptr的指针，如果该指针已经被其它地方释放，它则返回一个空的shared_ptr，也可以使用weak_ptr.expired()来判断一个指针是否被释放。<br><br>boost.weak_ptr不仅可以解决多线程访问带来的安全问题，而且还可以解决上面第三个问题循环引用。Children类代码修改如下，即可打破循环引用：<br><br>class child<br>{<br>public:<br>&nbsp; ~child() {&nbsp;<br>&nbsp;&nbsp; std::cout &lt;&lt;"子类析构函数被调用.\n";&nbsp;<br>&nbsp; }<br>public:<br>&nbsp; boost::weak_ptr&lt;parent&gt; parent;<br>};<br><br>因为boost::weak_ptr不增加引用计数，所以可以在退出函数域时，正确的析构。</p></div><div id="MySignature"></div>
<div class="clear"></div>
<div id="blog_post_info_block">
<div id="BlogPostCategory"></div>
<div id="EntryTag"></div>
<div id="blog_post_info"><div id="green_channel">
        <a href="javascript:void(0);" id="green_channel_digg" onclick="DiggIt(5296666,cb_blogId,1);green_channel_success(this,&#39;谢谢推荐！&#39;);">好文要顶</a>
            <a id="green_channel_follow" onclick="follow(&#39;3a580169-44bf-e111-aa3f-842b2b196315&#39;);" href="javascript:void(0);">关注我</a>
    <a id="green_channel_favorite" onclick="AddToWz(cb_entryId);return false;" href="javascript:void(0);">收藏该文</a>
    <a id="green_channel_weibo" href="javascript:void(0);" title="分享至新浪微博" onclick="ShareToTsina()"><img src="./shared_ptr 的使用及注意事项 - sunshinewave - 博客园_files/icon_weibo_24.png" alt=""></a>
    <a id="green_channel_wechat" href="javascript:void(0);" title="分享至微信" onclick="shareOnWechat()"><img src="./shared_ptr 的使用及注意事项 - sunshinewave - 博客园_files/wechat.png" alt=""></a>
</div>
<div id="author_profile">
    <div id="author_profile_info" class="author_profile_info">
            <a href="http://home.cnblogs.com/u/sunshinewave/" target="_blank"><img src="./shared_ptr 的使用及注意事项 - sunshinewave - 博客园_files/sample_face.gif" class="author_avatar" alt=""></a>
        <div id="author_profile_detail" class="author_profile_info">
            <a href="http://home.cnblogs.com/u/sunshinewave/">sunshinewave</a><br>
            <a href="http://home.cnblogs.com/u/sunshinewave/followees">关注 - 12</a><br>
            <a href="http://home.cnblogs.com/u/sunshinewave/followers">粉丝 - 5</a>
        </div>
    </div>
    <div class="clear"></div>
    <div id="author_profile_honor"></div>
    <div id="author_profile_follow">
                <a href="javascript:void(0);" onclick="follow(&#39;3a580169-44bf-e111-aa3f-842b2b196315&#39;);return false;">+加关注</a>
    </div>
</div>
<div id="div_digg">
    <div class="diggit" onclick="votePost(5296666,&#39;Digg&#39;)">
        <span class="diggnum" id="digg_count">0</span>
    </div>
    <div class="buryit" onclick="votePost(5296666,&#39;Bury&#39;)">
        <span class="burynum" id="bury_count">0</span>
    </div>
    <div class="clear"></div>
    <div class="diggword" id="digg_tips">
    </div>
</div>
</div>
<div class="clear"></div>
<div id="post_next_prev"><a href="http://www.cnblogs.com/sunshinewave/p/3265869.html" class="p_n_p_prefix">« </a> 上一篇：<a href="http://www.cnblogs.com/sunshinewave/p/3265869.html" title="发布于2013-08-18 13:16">小感</a><br><a href="http://www.cnblogs.com/sunshinewave/p/5296806.html" class="p_n_p_prefix">» </a> 下一篇：<a href="http://www.cnblogs.com/sunshinewave/p/5296806.html" title="发布于2016-03-19 23:58">boost::intrusive_ptr原理介绍</a><br></div>
</div>

</div>
	</div></div><a name="!comments"></a><div id="blog-comments-placeholder"></div><script type="text/javascript">var commentManager = new blogCommentManager();commentManager.renderComments(0);</script>
<div id="comment_form" class="commentform">
<a name="commentform"></a>
<div id="divCommentShow"></div>
<div id="comment_nav"><span id="span_refresh_tips"></span><a href="javascript:void(0);" onclick="return RefreshCommentList();" id="lnk_RefreshComments" runat="server" clientidmode="Static">刷新评论</a><a href="http://www.cnblogs.com/sunshinewave/p/5296666.html#" onclick="return RefreshPage();">刷新页面</a><a href="http://www.cnblogs.com/sunshinewave/p/5296666.html#top">返回顶部</a></div>
<div id="comment_form_container"><div class="login_tips">注册用户登录后才能发表评论，请 <a rel="nofollow" href="javascript:void(0);" class="underline" onclick="return login(&#39;commentform&#39;);">登录</a> 或 <a rel="nofollow" href="javascript:void(0);" class="underline" onclick="return register();">注册</a>，<a href="http://www.cnblogs.com/">访问</a>网站首页。</div></div>
<div class="ad_text_commentbox" id="ad_text_under_commentbox"></div>
<div id="ad_t2"><a href="http://www.ucancode.com/index.htm" target="_blank">【推荐】50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库</a><br><a href="https://cloud.tencent.com/solution/la?fromSource=gwzcw.485446.485446.485446" target="_blank">【推荐】腾讯云 十分钟定制你的第一个微信小程序</a><br><a href="http://www.gcpowertools.com.cn/products/activereports_overview.htm?utm_source=cnblogs&amp;utm_medium=blogpage&amp;utm_term=bottom&amp;utm_content=AR&amp;utm_campaign=community" target="_blank">【推荐】报表开发有捷径：快速设计轻松集成，数据可视化和交互</a><br></div>
<div id="opt_under_post"></div>
<div id="cnblogs_c1" class="c_ad_block"><a href="http://activity.huaweicloud.com/devcloud1024/?utm_source=cnblogs&amp;utm_medium=MediaB&amp;utm_campaign=%E5%8D%8E%E4%B8%BA%E4%BA%91-10%E6%9C%88%E5%B9%BF%E5%91%8A%E6%8A%95%E6%94%BE&amp;utm_content=%E5%8D%9A%E5%AE%A2%E5%9B%AD%E5%86%85%E9%A1%B5C1%E7%9F%A9%E5%BD%A2&amp;utm_term=%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91%E4%BA%91-1024%E8%AE%BA%E5%9D%9B%E6%B4%BB%E5%8A%A8" target="_blank"><img width="300" height="250" src="./shared_ptr 的使用及注意事项 - sunshinewave - 博客园_files/24442-20171015214114324-1153647777.jpg" alt="华为云1016C2"></a></div>
<div id="under_post_news"><div class="itnews c_ad_block"><b>最新IT新闻</b>:<br> ·  <a href="http://news.cnblogs.com/n/580423/" target="_blank">Chrome 62 for Mac发布 按钮设计优化，强推HTTPS</a><br> ·  <a href="http://news.cnblogs.com/n/580422/" target="_blank">Chrome OS勿扰模式界面获Material Design设计改善</a><br> ·  <a href="http://news.cnblogs.com/n/580421/" target="_blank">谷歌公布首款自主设计消费类芯片 要动高通奶酪</a><br> ·  <a href="http://news.cnblogs.com/n/580409/" target="_blank">面对强势英伟达 英特尔携Facebook开发人工智能芯片</a><br> ·  <a href="http://news.cnblogs.com/n/580408/" target="_blank">易到上海试点车主奖励金政策 每日每车最高奖励120元</a><br>» <a href="http://news.cnblogs.com/" title="IT新闻" target="_blank">更多新闻...</a></div></div>
<div id="cnblogs_c2" class="c_ad_block"><a href="http://click.aliyun.com/m/22446/" target="_blank"><img width="468" height="60" src="./shared_ptr 的使用及注意事项 - sunshinewave - 博客园_files/24442-20171001085719794-417760373.jpg" alt="阿里云1001"></a></div>
<div id="under_post_kb"><div class="itnews c_ad_block" id="kb_block"><b>最新知识库文章</b>:<br><div id="kb_recent"> ·  <a href="http://kb.cnblogs.com/page/579480/" target="_blank">实用VPC虚拟私有云设计原则</a><br> ·  <a href="http://kb.cnblogs.com/page/576251/" target="_blank">如何阅读计算机科学类的书</a><br> ·  <a href="http://kb.cnblogs.com/page/578103/" target="_blank">Google 及其云智慧</a><br> ·  <a href="http://kb.cnblogs.com/page/575829/" target="_blank">做到这一点，你也可以成为优秀的程序员</a><br> ·  <a href="http://kb.cnblogs.com/page/566880/" target="_blank">写给立志做码农的大学生</a><br></div>» <a href="http://kb.cnblogs.com/" target="_blank">更多知识库文章...</a></div></div>
<div id="HistoryToday" class="c_ad_block"></div>
<script type="text/javascript">
    fixPostBody();
    setTimeout(function () { incrementViewCount(cb_entryId); }, 50);
    deliverAdT2();
    deliverAdC1();
    deliverAdC2();    
    loadNewsAndKb();
    loadBlogSignature();
    LoadPostInfoBlock(cb_blogId, cb_entryId, cb_blogApp, cb_blogUserGuid);
    GetPrevNextPost(cb_entryId, cb_blogId, cb_entryCreatedDate);
    loadOptUnderPost();
    GetHistoryToday(cb_blogId, cb_blogApp, cb_entryCreatedDate);   
</script>
</div>


			</div>
		</td>
	</tr>
	<tr>
		<td colspan="2" class="FooterCell">
			
<p id="footer">
	Powered by: 
	<br>
	
	<a id="Footer1_Hyperlink3" name="Hyperlink1" href="http://www.cnblogs.com/" style="font-family:Verdana;font-size:12px;">博客园</a>
	<br>
	Copyright © sunshinewave
</p>

		</td>
	</tr>
</tbody></table>



</body></html>